package com.lmn.itext;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

import javax.imageio.ImageIO;
import java.awt.image.renderable.RenderableImage;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class PdfTest {

    public static void main(String[] args) throws DocumentException, IOException {
        Map<String, Object> data = new HashMap<>();
        data.put("", "");

        String inputPdfPath = "";
        String outPutPdfPath = "";
        op_pdf(data, inputPdfPath, outPutPdfPath);
    }

    public static void op_pdf(Map<String, Object> data, String inputPdfPath, String outPutPdfPath) throws DocumentException, IOException {
        //初始化itext
        //设置编码
        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        PdfReader pdfReader = new PdfReader(inputPdfPath);
        PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outPutPdfPath));
        AcroFields form = pdfStamper.getAcroFields();
        form.addSubstitutionFont(baseFont);

        //写入数据
        for (String key : data.keySet()) {
            String value = data.get(key).toString();
            //key对应模板数据域的名称
            form.setField(key, value);
        }
        //添加图片
        int pageNo = form.getFieldPositions("img").get(0).page;
        Rectangle signRect = form.getFieldPositions("img").get(0).position;
        float x = signRect.getLeft();
        float y = signRect.getBottom();
        Image image = Image.getInstance("图片路径");
        PdfContentByte under = pdfStamper.getOverContent(pageNo);
        //设置图片大小
        image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
        //设置图片位置
        image.setAbsolutePosition(x, y);
        under.addImage(image);
        //设置不可编辑
        pdfStamper.setFormFlattening(true);
        pdfStamper.close();
    }

    public static void pdf() {
        PdfContentByte waterMar;
        try {
            //文档对象  实现A4纸页面
            Document document = new Document(PageSize.A4);
            //document.setMarginMirroring(true);
            //设置文档的页边距就是距离页面边上的距离，分别为：左边距，右边距，上边距，下边距
            document.setMargins(70, 70, 20, 10);
            //这个是生成破pdf的位置以及名称
            String fileName = "C:\\Users\\Desktop\\" + System.currentTimeMillis() + ".pdf";
            PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(fileName));
            //打开文档
            document.open();
            // 加载字体，因为我们标题和正文可能用的不是同一种字体，所以我们创建两种字体
            //有其他需求的就可以创建更多的字体
            //字体都是电脑自带的，如果你想要的电脑没有，就去网上下载
            //创建标题字体
            BaseFont title = BaseFont.createFont("c://windows//fonts//simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            //创建正文字体
            BaseFont bf = BaseFont.createFont("c://windows//fonts//simfang.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            //上面是基础的字体，代表使用哪一种字体，下面设置的是字体的字号，粗细等等属性
            //使用上面的title 字体 加粗，这个是标题字体
            Font titleFont = new Font(title, 22, Font.BOLD);
            //使用字体，正文字体
            Font font = new Font(bf, 16);
            // 这个是我们动态填充的字体，Font.UNDERLINE带下划线的
            Font underlineFont = new Font(bf, 16, Font.UNDERLINE);

            // -------------------设置 二维码图片 ----------------
            // 加入水印
            waterMar = pdfWriter.getDirectContentUnder();
            // 开始设置水印图片
            waterMar.beginText();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            //QrCodeUtils.createQrCodeBufferdImage这个方法就是将网址变成二维码图片
            ImageIO.write( "png", out);
            byte[] b = out.toByteArray();
            Image itextimage = Image.getInstance(b);
            // 水印图片位置 第一个参数为x轴，第二个参数为y轴
            itextimage.setAbsolutePosition(120, 410);
            // 附件加上水印图片
            waterMar.addImage(itextimage);
            //结束设置
            waterMar.endText();
            waterMar.stroke();

            // -------------------设置 段落 ----------------
            //这里面可以设置段落和短语（块），如果是那种固定文字的段落就可以用段落
            //如果我们需要生成的段落里有需要动态填充的就用块，一点一点的拼起来，直到达到我们的效果
            //段落
            Paragraph p = null;
            p = new Paragraph("哈哈哈哈哈哈哈哈哈哈哈哈哈哈", titleFont);
            p.setLeading(30);
            p.setAlignment(Element.ALIGN_CENTER);//设置对齐方式，这个是居中对齐
            document.add(p);
            p = new Paragraph("哈哈哈哈哈哈哈", titleFont);
            p.setLeading(30);
            p.setAlignment(Element.ALIGN_CENTER);//设置对齐方式
            document.add(p);

            p = new Paragraph();
            //短语
            Phrase ph = new Phrase();
            //块
            ph.add(new Chunk("哈哈哈哈哈哈哈", font));
            ph.add(new Chunk("2022" + " ", underlineFont));//年份
            ph.add(new Chunk("第", font));
            ph.add(new Chunk("100" + " ", underlineFont));// 号数
            ph.add(new Chunk("号", font));
            p.add(ph);
            p.setSpacingBefore(20);//段落与段落的间距，我们一个ph就组成一个段落
            p.setAlignment(Element.ALIGN_RIGHT);//设置对齐方式，右对齐
            p.setLeading(20);//行间距
            document.add(p);

            p = new Paragraph();
            ph = new Phrase();
            ph.add(new Chunk("哈哈哈哈哈哈哈：", underlineFont));//机构名称
            p.add(ph);
            //设置和上行的间隔
            p.setSpacingBefore(10);
            //p.setLeading(20);
            document.add(p);

            p = new Paragraph();
            ph = new Phrase();
            ph.add(new Chunk("    哈哈哈哈哈哈哈", font));
            ph.add(new Chunk("哈哈哈哈哈哈哈1", underlineFont));//项目名称
            ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈2", font));
            ph.add(new Chunk("哈哈哈哈哈哈哈3", underlineFont));//医院名称
            ph.add(new Chunk("哈哈哈哈哈哈哈4", font));
            ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈5", underlineFont));//建设项目名称
            ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈6", font));
            ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈7", underlineFont));//号
            ph.add(new Chunk("哈哈哈哈哈哈哈8", font));
            //ph.setMultipliedLeading(20);
            p.add(ph);
            p.setSpacingBefore(5);
            p.setLeading(30);
            document.add(p);

            p = new Paragraph();
            ph = new Phrase();
            ph.add(new Chunk("    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈9", font));
            ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈10", underlineFont));//项目名称
            ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈11", font));
            p.add(ph);
            p.setSpacingBefore(5);
            p.setLeading(30);
            document.add(p);

            p = new Paragraph();
            ph = new Phrase();
            ph.add(new Chunk("    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈12。", font));
            p.add(ph);
            p.setSpacingBefore(5);
            p.setLeading(30);
            document.add(p);


            p = new Paragraph();
            ph = new Phrase();
            ph.add(new Chunk("    此复", font));
            p.add(ph);
            p.setSpacingBefore(5);
            p.setLeading(30);
            document.add(p);


            p = new Paragraph();
            ph = new Phrase();
            ph.add(new Chunk("哈哈哈哈哈哈哈哈哈哈哈哈哈哈13", font));
            p.add(ph);
            p.setSpacingBefore(5);
            p.setAlignment(Element.ALIGN_RIGHT);//设置对齐方式
            p.setLeading(30);
            document.add(p);

            p = new Paragraph();
            ph = new Phrase();

            ph.add(new Chunk("2022", underlineFont));//年
            ph.add(new Chunk("年", font));
            ph.add(new Chunk("11", underlineFont));//月
            ph.add(new Chunk("月", font));
            ph.add(new Chunk("20" + " ", underlineFont));//日
            ph.add(new Chunk("日", font));
            p.add(ph);
            p.setSpacingBefore(5);
            p.setAlignment(Element.ALIGN_RIGHT);//设置对齐方式
            p.setLeading(30);
            document.add(p);

            document.close();
            pdfWriter.close();
            System.out.println("创建成功！");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
